package com.miui.systemui.tools


import com.google.gson.*
import java.util.*

object JsonCleaner {

    private val gson = Gson()

    /**
     * 遍历整个 JSON 字符串并删除指定的节点。
     *
     * @param jsonString   要清理的 JSON 字符串
     * @param keysToRemove 不需要的节点名称列表
     * @return 清理后的 JSON 字符串
     */
    fun cleanJson(jsonString: String, vararg keysToRemove: String): String {
        // 解析 JSON 字符串到 JsonElement
        val jsonElement = gson.fromJson(jsonString, JsonElement::class.java)

        // 如果是 JsonObject，则移除不需要的节点
        if (jsonElement.isJsonObject) {
            removeUnwantedNodes(jsonElement.asJsonObject, keysToRemove.asList())
        }

        // 将 JsonElement 转换回 JSON 字符串
        return gson.toJson(jsonElement)
    }

    private fun removeUnwantedNodes(jsonObject: JsonObject, keysToRemove: List<String>) {
        val iterator = jsonObject.entrySet().iterator()
        while (iterator.hasNext()) {
            val entry = iterator.next()
            val key = entry.key
            val element = entry.value

            if (isJsonElementNumber(element)) {
                val number = element.asDouble
                entry.setValue(doubleToJsonElement(number))
                System.out.println("element:" + number)
            }

            if (isJsonElementString(element) && element.asString in keysToRemove) {
                iterator.remove()
            }
            if (key in keysToRemove) {
                iterator.remove() // 删除当前迭代器指向的元素
            } else {
                when {
                    element.isJsonObject -> removeUnwantedNodes(
                        element.asJsonObject, keysToRemove
                    ) // 递归处理
                    element.isJsonArray -> {
                        val jsonArray = element.asJsonArray

                        // 获取JSONArray的Iterator
                        val iterator: MutableIterator<Any> = jsonArray.iterator()
                        // 使用Iterator遍历JSONArray
                        while (iterator.hasNext()) {
                            val nextNode = iterator.next()
                            if (nextNode is JsonObject) {
                                val obj: JsonObject = nextNode
                                if (obj.get("name") != null && obj.get("name").asString in keysToRemove) {
                                    // 使用Iterator的remove方法移除该元素
                                    iterator.remove()
                                }
                            }
                        }
                        jsonArray.iterator().forEach { arrayElement ->
                            if (arrayElement.isJsonObject) {
                                removeUnwantedNodes(arrayElement.asJsonObject, keysToRemove) // 递归处理
                            }
                        }
                    }
                }
            }
        }
    }

    private fun isJsonElementString(jsonElement: JsonElement): Boolean {
        return jsonElement.isJsonPrimitive && jsonElement.asJsonPrimitive.isString
    }

    private fun isJsonElementNumber(jsonElement: JsonElement): Boolean {
        return jsonElement.isJsonPrimitive && jsonElement.asJsonPrimitive.isNumber
    }

    private fun doubleToJsonElement(number: Double): JsonElement {
        // 使用Gson库将Double转换为JsonElement，并保留两位小数
        val gson = Gson()
        val formattedNumber = String.format("%.2f", number)
        val doubleValue = formattedNumber.toDouble() // 将格式化后的字符串转换为Double类型
        return gson.toJsonTree(doubleValue) // 将Double转换为JsonElement
    }
}